#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_adc.h"
#include "hi_errno.h"

#define LED_TASK_STACK_SIZE 512
#define LED_TASK_PRIO 25
#define LED1_GPIO 10 // LED1 GPIO编号
#define LED2_GPIO 0  // LED2 GPIO编号
#define TASK_DELAY_TIME 200000
#define F1 11 // 按键F1 GPIO编号
#define F2 12 // 按键F2 GPIO编号

enum LedState {
    LED_OFF = 0,
    LED_ON,
};

enum LedState g_LED1State = LED_OFF; // LED1初始状态
enum LedState g_LED2State = LED_OFF; // LED2初始状态

static void F1_Pressed(char *arg) {
    (void)arg;
    printf(" F1 Pressed\n");
    g_LED1State = (g_LED1State == LED_OFF) ? LED_ON : LED_OFF; // 切换LED1状态
    usleep(TASK_DELAY_TIME);
}

static void F2_Pressed(char *arg) {
    (void)arg;
    printf(" F2 Pressed\n");
    g_LED2State = (g_LED2State == LED_OFF) ? LED_ON : LED_OFF; // 切换LED2状态
    usleep(TASK_DELAY_TIME);
}

static void ButtonledInit(void) {
    // 初始化LED1
    IoTGpioInit(LED1_GPIO);
    hi_io_set_func(LED1_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(LED1_GPIO, IOT_GPIO_DIR_OUT);

    // 初始化LED2
    IoTGpioInit(LED2_GPIO);
    hi_io_set_func(LED2_GPIO, HI_IO_FUNC_GPIO_0_GPIO);
    IoTGpioSetDir(LED2_GPIO, IOT_GPIO_DIR_OUT);

    // 初始化按键F1
    hi_gpio_init();
    hi_io_set_pull(F1, HI_IO_PULL_UP);
    hi_io_set_func(F1, HI_IO_FUNC_GPIO_11_GPIO);
    hi_gpio_set_dir(F1, HI_GPIO_DIR_IN);
    hi_gpio_register_isr_function(F1,
                                  HI_INT_TYPE_EDGE,
                                  HI_GPIO_EDGE_FALL_LEVEL_LOW,
                                  &F1_Pressed,
                                  NULL);

    // 初始化按键F2
    hi_io_set_pull(F2, HI_IO_PULL_UP);
    hi_io_set_func(F2, HI_IO_FUNC_GPIO_12_GPIO);
    hi_gpio_set_dir(F2, HI_GPIO_DIR_IN);
    hi_gpio_register_isr_function(F2,
                                  HI_INT_TYPE_EDGE,
                                  HI_GPIO_EDGE_FALL_LEVEL_LOW,
                                  &F2_Pressed,
                                  NULL);
}

static void *LedTask(const char *arg) {
    (void)arg;
    while (1) {
        // 控制LED1
        if (g_LED1State == LED_ON) {
            IoTGpioSetOutputVal(LED1_GPIO, 1);
        } else {
            IoTGpioSetOutputVal(LED1_GPIO, 0);
        }

        // 控制LED2
        if (g_LED2State == LED_ON) {
            IoTGpioSetOutputVal(LED2_GPIO, 1);
        } else {
            IoTGpioSetOutputVal(LED2_GPIO, 0);
        }

        usleep(TASK_DELAY_TIME); // 两个LED共用一个延时
    }
    return NULL;
}

static void LedExampleEntry(void) {
    osThreadAttr_t attr;
    ButtonledInit();
    attr.name = "LedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED_TASK_STACK_SIZE;
    attr.priority = LED_TASK_PRIO;
    if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
        printf("[LedExample] failed to create ledtask!\n");
    }
}

SYS_RUN(LedExampleEntry);